package com.example.qwen02.controller;

import com.alibaba.dashscope.aigc.conversation.Conversation;
import com.alibaba.dashscope.aigc.conversation.ConversationParam;
import com.alibaba.dashscope.aigc.conversation.ConversationResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.baidubce.qianfan.Qianfan;
import com.baidubce.qianfan.core.auth.Auth;
import com.baidubce.qianfan.model.chat.ChatResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

//@CrossOrigin
//@RestController
//@RequestMapping("/api")
public class Controller {


//    @PostMapping("/askQwen")
    public String askQwen(@RequestParam String question, @RequestParam String role, HttpSession session) {
        try {
//            为了避免多用户的历史记录被混杂在一起需要在session中分别存储各自的集合
            List<String> messages=(List<String>) session.getAttribute("history");
            if (messages==null){
                messages=new LinkedList<>();
                session.setAttribute("history",messages);
            }
//            使模型有记忆
            messages.add(getPrompt(role)+"用户说："+question);
//            messages.add("用户说："+question);
            StringBuilder sb=new StringBuilder();
            for(String message:messages){
                sb.append(message);
            }
            String prompt = "你是一个小助手，回答用户的问题";
            Conversation conversation = new Conversation();
            int defaultMaxTokens = 200;
            ConversationParam param = ConversationParam
                    .builder()
                    .model(Conversation.Models.QWEN_TURBO)
                    .apiKey(System.getenv("DASHSCOPE_API_KEY"))
//                    .prompt(getPrompt(role)+"用户说："+question) // 修改prompt
                    .prompt(prompt + sb.toString())
                    .maxTokens(defaultMaxTokens)
                    .build();
            ConversationResult result = conversation.call(param);

            messages.add("小助手说" + result.getOutput().getText());//保存ai回答的
//            控制记忆体，删除历史
            if(messages.size()>6){
                messages.remove(0);
            }
            return result.getOutput().getText();
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            return e.getMessage();
        }
    }
    private final String ACCESS_KEY = "ALTAKMQb2dHELUqYwxPHrZMwui";
    private final String SECRET_KEY = "d96ef21b31064014b47e982c74c62ac5";
    @PostMapping("/askBaidu")
    public String askBaidu(@RequestParam String question, @RequestParam String role, HttpSession session) {
        //            为了避免多用户的历史记录被混杂在一起需要在session中分别存储各自的集合
        List<String> messages=(List<String>) session.getAttribute("history");
        if (messages==null){
            messages=new LinkedList<>();
            session.setAttribute("history",messages);
        }
//            使模型有记忆
        messages.add(getPrompt(role)+"用户说："+question);
//            messages.add("用户说："+question);
        StringBuilder sb=new StringBuilder();
        for(String message:messages){
            sb.append(message);
        }
        String prompt = "你是一个小助手，回答用户的问题";

        // 使用安全认证AK/SK鉴权，替换下列示例中参数，安全认证Access Key替换your_iam_ak，Secret Key替换your_iam_sk
        Qianfan qianfan = new Qianfan(ACCESS_KEY, SECRET_KEY);
        // 调用默认模型
        ChatResponse response = qianfan.chatCompletion()
                .model("Qianfan-Chinese-Llama-2-13B") // 使用model指定预置模型
                // .endpoint("completions_pro") // 也可以使用endpoint指定任意模型 (二选一)
//                .addMessage("user", getPrompt(role)+"用户说："+question) // 修改添加用户消息
                .addMessage("user", prompt + sb.toString())
                .temperature(0.7) // 自定义超参数
                .execute(); // 发起请求
        messages.add("小助手说" + response.getResult());//保存ai回答的
//            控制记忆体，删除历史
        if(messages.size()>6){
            messages.remove(0);
        }
        return response.getResult();
    }

    public static String getPrompt(String subject) {
        Map<String, String> promptMap = new HashMap<>();

        // 语文科目的提示语
        String chinesePrompt = "科目：语文；任务：当我在语文学习上遇到困难时，需要你的帮助和指导，特别是在阅读理解和作文方面；例如：我说：这篇文章的主题是什么？你可以回答：这篇文章的主题是……";

        // 数学科目的提示语
        String mathPrompt = "科目：数学；任务：当我在数学学习上遇到问题时，需要你的解答和指导，特别是在解题思路和公式应用方面；例如：我说：这道数学题不会做，你可以解释：这道题的解法是……";

        // 英语科目的提示语
        String englishPrompt = "科目：英语；任务：当我在英语学习上遇到困难时，需要你的帮助，特别是在单词记忆和语法理解方面；例如：我说：这个单词怎么读？你可以回答：这个单词的读音是……";

        // 将科目和对应的提示语存入Map中
        promptMap.put("语文", chinesePrompt);
        promptMap.put("数学", mathPrompt);
        promptMap.put("英语", englishPrompt);

        // 根据科目返回相应的提示语
        return promptMap.getOrDefault(subject, "抱歉，暂时没有适合该科目的提示语。");
    }
}
